import os
import time
import numpy as np
from enum import Enum

#抓取的列表#       [日期时间 ---- 收支 支付状态 支付方式 交易对方 商品 金额 ------- 分类 ------]
#完整的列表#       [日期时间 来源 收支 支付状态 支付方式 交易对方 商品 金额 修订金额 分类 智能分类]
class GlobalConfig:
    def cfgprint(self):
        print(f'\n\n\t================================================ 基于配置信息 ================================================')
        print(f'\t    工资卡尾号：【 {self.BANKCARD} 】')
        print(f'\t    过滤关键词：')
        for column_name, keywords  in self.KEYWORD_FILTER.items():
            print(f'\t\t规则：{column_name} \t包含：{keywords}')
        print(f'\t================================================ 重要配置信息 ================================================')

    ZFB = { 'INV_ROW': 24 ,                                   # csv文件开头需要舍弃的行
                'ENCODING': 'GBK' ,
                'COLS': [0, 5, 8, 7, 2, 4, 6, 1] ,
                'FILE_HEADER': 'alipay_record'   
    }    
    WEI = { 'INV_ROW': 16 ,
                'ENCODING': 'utf-8' ,
                'COLS': [0, 4, 7, 6, 2, 3, 5, 1],
                'FILE_HEADER': '微信支付账单'
    }
    
    KEYWORD_FILTER = {           #自定义关键词过滤,字符串格式支持通配符
        '收支': ['/','不计收支'],  #自己账户之间互转不统计
        '支付状态': ['退款成功', '交易关闭', '还款成功','对方已退还','已全额退款','已退款￥'],
        '金额': [0,0.1,0.01]
        # '支付方式': [''],
        # '交易对方': [''],
        # '商品': [''],
        # '来源': [''],
    }

    #工资卡 (转入转出工资卡的算作收支)
    BANKCARD = '0139'

    #  账本路径 和 账单文件夹,设置excel单元格默认列宽
    EXPORT = 'Export'
    RECORDS_DIR = 'records'
    TIME = time.strftime("%Y%m%d_%H%M%S", time.localtime())
    SAVECSV = os.path.join(EXPORT, f'Bill_{TIME}.xlsx')
    # SAVECSV = os.path.join(EXPORT, f'Bill_test.xlsx')
    SAVEHTML = os.path.join(EXPORT, f'Bill_{TIME}.html')
    # SAVEHTML = os.path.join(EXPORT, f'Bill_test.html')
    EXCEL_WIDTH =   [22, 7, 10, 10, 20, 20, 30, 10, 15, 13,13]

    # 这里的列名和表格保持一致，最终导出样式
    DTYPE = { '日期时间': 'datetime64[ns]', 
                    '来源': str, 
                    '收支': str, 
                    '支付状态': str, 
                    '支付方式': str, 
                    '交易对方': str, 
                    '商品': str,
                    '金额': float, 
                    '修订金额': float, 
                    '分类': str,
                    '智能分类': str 
    }
    Labels = {
        '智能分类': ['银行存取','投资理财','餐饮美食','交通出行','日用百货','医疗健康','保险','服饰装扮',
        '充值缴费','转账红包','信用借还','收入','生活服务','文化休闲','美容美发',
        '数码电器','家居家装','酒店旅游','其他','亲友代付','运动户外' ,'商业服务']
    }

class AutoLabelRules:
    def __init__(self):
        cfg = GlobalConfig()
        """自定义规则
        举例('#'后面为用法解释)：
        ===========================================
            '转账红包':      #下面[]里面的条件满足时，'智能分类'的名字会被设置成这个
                    [    
                        {'分类': '转账|红包'},   #大括号里，每个':'前面为列名，后面为需要判断的字符
                        ...                                     #可以多个大括号，每个大括号必须同时满足
                        {'商品': '二维码收款',...,'来源': '微信'},    #大括号中可以多对，只要里面任意一对满足即可
                    ], 

            '账户存取':      
                    [               
                            [   
                                {'支付方式': cfg.BANKCARD},   
                                {'商品': '转入|转出','分类': '充值|提现'},
                            ],
                            ...     #可以有多组规则指向同一个分类名 这里规则-> '账户存取'
                            ...     #每组需要都写上中括号
                            [
                                {'分类': cfg.BANKCARD},
                                {'分类': '转入|转出'},
                            ],
                   ],
        ===========================================
        #支持的列名:  来源  收支  支付状态    支付方式    交易对方    商品  金额  修订金额    分类
        #智能分类建议选用参数：
            '银行存取','投资理财','餐饮美食','交通出行','日用百货','医疗健康','保险','服饰装扮',
            '充值缴费','转账红包','信用借还','收入','生活服务','文化休闲','美容美发',
            '数码电器','家居家装','酒店旅游','其他','亲友代付','运动户外' ,'商业服务'
        """

        餐饮美食 = ('小吃|肠粉|味道|铁板|虾滑|芋泥|奶茶|小笼包|包子|汤包|面条|小面|小馆|美团订单|' 
                            '麦当劳|肯德基|海底捞|捞面|米粉|满座儿|美食|外婆家|西北莜面村|必胜客|潘多拉|蜜雪冰城|萨莉亚|小龙坎|' 
                            '牛肉|羊肉|火锅|串串|水煮鱼|家常菜|烤肉|韩国料理|绝味|麻辣烫|杨国福|咕水|杭研所二期|'
                            '菜馆|饭店|面馆|湘菜|川菜|粤菜|湘菜|鲁菜|东北菜|西餐|日料|韩料|意大利菜|'
                            '咖啡馆|茶餐厅|面馆|酒吧|快餐店|餐厅|餐馆|里小厨|'
                            '堂食|外卖|订餐|送餐|点餐|自助餐|宴会|包间|脆皮|饼|馒头|面包|馕|'
                            '披萨|汉堡|寿司|炸鸡|炸薯条|饺子|烧卖|牛排|鲜果|蔬菜|水果|牛奶|果汁|饮料|'
                            '可口可乐|百事可乐|雪碧|芬达|七喜|美年达|脉动|农夫山泉|苏打水|雪山水|百岁山|'
                            '王老吉|康师傅|养生堂|乌龙茶|绿茶|红茶|奶茶|怡宝|汇源|果粒橙|鲜橙多|果蔬汁|'
                            '星巴克|雀巢咖啡|拿铁|卡布奇诺|景田|健力宝|'
                            '红牛|风味奶|酸奶|茉酸奶')


        交通出行 = ('捷安特|美利达|喜德盛|打车|公交|公共交通|地铁|轨道交通|哈啰出行|单车|蒜芽信息|智行|出行|乘车|'
                            '出租车|专车|约车|专车|滴滴|花小猪|汽车|车票|机票|船票|火车|高铁|飞机' )

        日用百货 = ('超市|便利店')
        文化休闲 = ('文具|书籍')
        充值缴费 = ('充值|缴费|水费|电费|能耗费|云牧科技|腾讯云|阿里云|iCloud')
        数码电器 = ('手机|电脑|电动车|耳机|音箱|音响|漫步者|哈曼卡顿|飞利浦|松下|手柄|键盘|鼠标|显示器|戴尔|联想|'
                            '路由器')

        美容美发 = ('美发|美甲|理发|造型|美睫|脱毛|美体|SPA|按摩|护理|面部护理|'
                            '洗剪吹|烫发|染发|造型|接发|护发|发型|发膜|发油|'
                            '修甲|甲油|指甲艺术|指甲延长|甲片|甲贴|'
                            '化妆品|护肤品|面膜|乳液|精华液|口红|眼影|睫毛膏|腮红')

        酒店旅游 = ('旅游|景区|景点|观光|旅行社'
                            '酒店|旅馆|客栈|民宿|度假村|宾馆|青年旅舍|'
                            '单人间|双人间|豪华套房|标准间|家庭房|海景房|湖景房')


        #匹配规则：当匹配到前面的类，则后面的不再执行，如有交集，优先级低的写后面
        self.rules = {
            '银行存取':
                    [
                            [
                                {'支付方式': cfg.BANKCARD},
                                {'商品': '转入|转出','分类': '充值|提现'},
                            ],
                            [
                                {'分类': cfg.BANKCARD},
                                {'分类': '转入|转出'},
                            ],
                   ],

            '转账红包':
                    [
                        {'来源': '微信'},
                        {'分类': '转账|红包'},
                    ], 

            '餐饮美食':
                    [
                        {'来源': '微信'},
                        {'交易对方': 餐饮美食 ,'商品': 餐饮美食 },
                    ],

            '交通出行':
                    [
                        {'来源': '微信'},
                        {'交易对方': 交通出行,'商品': 交通出行},
                    ], 

            '文化休闲':
                    [
                        {'来源': '微信'},
                        {'交易对方': 文化休闲,'商品': 文化休闲},
                    ],

            '美容美发':
                    [
                        {'来源': '微信'},
                        {'交易对方': 美容美发,'商品': 美容美发},
                    ],

            '日用百货':
                    [
                        {'来源': '微信'},
                        {'交易对方': 日用百货,'商品': 日用百货},
                    ],

            '酒店旅游':
                    [
                        {'来源': '微信'},
                        {'交易对方': 酒店旅游,'商品': 酒店旅游},
                    ], 
            '充值缴费':
                    [
                        {'来源': '微信'},
                        {'交易对方': 充值缴费,'商品': 充值缴费},
                    ],
            '数码电器':
                    [
                        {'交易对方': 数码电器,'商品': 数码电器},
                    ],


            '其他':
                    [
                        {'来源': '微信'},
                        {'分类': '二维码|商户消费|付款码'},
                    ],
        }

